package StructuralPattern.Facade;

/**
 * @Classname : FacadeClient
 * @Description : 测试 门面模式
 * 行为型-门面/外观模式
 * 一、模式定义
 *   Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use．
 *   要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。
 *   优点：总的来说降低了系统间的依赖，对子系统内部来说提高了安全性，对外部系统来说子系统更易于使用。
 *   缺点：门面类是实现类，当需要调整时直接对门面类修改，违反开闭原则，存在系统风险。
 *   注意：
 *      ① 子系统可以是一个类，也可以是多个具有相关功能类的集合，甚至是一个服务系统。
 *      ② 门面类可以有多个，提供不同操作权限的访问，但是其他门面类要依赖最高权限门面实现（如 Facade2），避免相似功能多出修改。
 *      ③ 门面类不参与子系统业务逻辑实现，只透传访问，如有特殊逻辑可在子系统创建类实现后（如 ComplexMode），再在门面类中提供访问。
 * 二、模式类图
 *   https://kdocs.cn/l/ce4TP5lZGgj6
 * 三、适用场景
 *   1、当子系统逻辑复杂时，可使用门面模式把子系统封装成黑箱，提供外部访问。
 *   2、当低水平技术人员参与项目开发时，让其在指定子系统中开发，然后提供门面接口供外部访问，从而降低个人代码质量对整体项目的影响风险。
 * 四、应用举例
 *   1、工具类
 *
 * @Author : chentianyu
 * @Date 2023/2/19 22:38
 */


public class FacadeClient {
    public static void main(String[] args) {
        System.out.println("—————————门面对象（高权限）————————");
        Facade facade = new Facade();
        facade.methodA();
        facade.methodB();
        facade.methodC();
        facade.complexMethod();

        System.out.println("—————————门面对象（低权限）————————");
        Facade2 facade2 = new Facade2();
        facade2.methodB();
    }
}

/** 20230219
 * —————————门面对象（高权限）————————
 * 模块A执行方法
 * 模块B执行方法
 * 模块C执行方法
 * 模块A执行方法
 * 模块B执行方法
 * —————————门面对象（低权限）————————
 * 模块B执行方法
 */
